package com.tcc.etec.mecashow.bdados;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseCreator extends SQLiteOpenHelper {
	
	private static String NOME_BANCO_DE_DADOS = "meca-show.sqlite";
	private static String CAMINHO_BANCO_DE_DADOS;
	
	private final Context context;

	public DatabaseCreator(Context context) {
		super(context, NOME_BANCO_DE_DADOS, null, 1);
		this.context = context;
		CAMINHO_BANCO_DE_DADOS = this.context.getFilesDir().getPath();
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}

	// Verifica se o banco de dados existe e retorna true ou false
	private boolean checkDataBase() {

		SQLiteDatabase db = null;

		try {
			final String path = CAMINHO_BANCO_DE_DADOS + NOME_BANCO_DE_DADOS;
			db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
			db.close();
		} catch (SQLiteException e) {
			Log.e(e.getLocalizedMessage(), "Data base doesn't exists.");
		}

		return db != null;
	}

	private void createDataBase() throws Exception {
		final boolean exists = checkDataBase();

		if (!exists) {
			this.getWritableDatabase();
			try {
				copyDatabase();
			} catch (IOException e) {
				throw new Error("Não foi possível copiar o arquivo");
			}
		}
	}

	// Copia o banco de dados da pasta assets para o telefone
	private void copyDatabase() throws IOException {

		final String dbPath = CAMINHO_BANCO_DE_DADOS + NOME_BANCO_DE_DADOS;

		// Abre o arquivo o destino para copiar o banco de dados
		final OutputStream dbStream = new FileOutputStream(dbPath);

		// Abre Stream do nosso arquivo que esta no assets
		final InputStream dbInputStream = context.getAssets().open(NOME_BANCO_DE_DADOS);

		final byte[] buffer = new byte[1024];
		int length;
		while ((length = dbInputStream.read(buffer)) > 0) {
			dbStream.write(buffer, 0, length);
		}

		dbInputStream.close();

		dbStream.flush();
		dbStream.close();

	}

	public SQLiteDatabase getDatabase() {
		try {
			createDataBase();

			final String path = CAMINHO_BANCO_DE_DADOS + NOME_BANCO_DE_DADOS;

			return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);

		} catch (Exception e) {
			return getWritableDatabase();
		}

	}
}
